home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / utilprn / hpdeskje.sit / HPDJet ƒ / PACK.c < prev    next >
Text File  |  1989-04-02  |  11KB  |  411 lines

  1. /* 02.04.1989  amn  (latest edit) */
  2.  
  3. /* PACK.c  -  printer driver for Macintosh and HP DeskJet, Chooser interface. */
  4.  
  5. /*
  6. Code for PACK ID -4096 to be used with the Chooser to set
  7. the printing port options.  Set the Flags longword in the PACK
  8. resource to $0400E000 after building the PACK resource to make
  9. sure we get the right-hand button message.
  10. */
  11.  
  12. /* Resources which are of standard types and accessed by this Chooser package */
  13. /* have id# RESID_OWNED_BY_CHOOSER_PACK (-4080).  (IM 4 says standard resource */
  14. /* types to be used by this PACK resource should have IDs in the range -4080 */
  15. /* to -4065.) */
  16. /* Resources which are of non-standard types and/or belong to our driver code */
  17. /* are accessed with RESID_OWNED_BY_PDEF (-8192). */
  18. /* These include the 'Sntg' resource and our PREC #-8192 ???. */
  19.  
  20. /* Authors:  Ari Mujunen (amn@hutcs.hut.fi) and Olli Arnberg (oar@hutcs.hut.fi). */
  21. /* Copyright Ari Mujunen, Olli Arnberg 1989. */
  22. /* You may redistribute the driver (=printer resource file, source files, */
  23. /* documentation file(s), and the file 'Copyright and Source Offer') */
  24. /* only _non-commercially_ and _in its entirety_. */
  25. /* See the file 'Copyright and Source Offer' and/or documentation for details. */
  26. /* Acknowledgements:  Special thanks to Mr. Earle R. Horton for his 'Daisy' */
  27. /* daisywheel printer driver and its source code published in 'MacTutor', Nov-Dec 1987. */
  28. /* This driver served as a basis and inspiration for our work.  It also */
  29. /* proofed that a Macintosh printer driver can be done despite the lack of */
  30. /* documentation from Apple. */
  31.  
  32. /* Change history: */
  33. /* Version  When        Who      Why */
  34. /* 2.0      25.03.1989  amn,oar  Original rewrite. */
  35. /*          26.03.1989  amn      Trying to make setting changes immediate. */
  36. /*          28.03.1989  amn      Settable printer origin. */
  37. /*          31.03.1989  amn      Gave up making immediate setting changes. */
  38. /* 2.1      02.04.1989  amn,oar  Released version. */
  39.  
  40.  
  41. #include "common_mac_includes.h"
  42. #include "prglobals.h"
  43.  
  44.  
  45. /* Printer Setup Dialog box item numbers: */
  46. #define MODEMBUTTON 3
  47. #define PRINTERBUTTON 4
  48. #define BAUDBUTTON 5
  49. #define CTSBUTTON 6
  50. #define XONXOFFBUTTON 7
  51. #define INITSTR 8
  52. #define TOPSTR 9
  53. #define EOPSTR 10
  54. #define EOFSTR 11
  55. #define ORIGINTOPNUM 12
  56. #define ORIGINLEFTNUM 13
  57. #define DUMPRESOLUTIONBUTTON 14
  58. #define MOVEBYWORDBOX 15
  59. #define COMPATIBLEBOX 16
  60.  
  61. #define NUMSTRINGS 4
  62. #define RESPAD 24
  63.  
  64.  
  65. /* Type definitions: */
  66.  
  67. typedef struct tLabel {
  68.     int    value;
  69.     char label[10];
  70. } tLabel;
  71.  
  72. typedef struct tLabels {
  73.     int iNumberOfItems;
  74.     tLabel alternative[1];
  75. } tLabels, **htLabels;
  76.  
  77.  
  78. /* Prototypes: */
  79.  
  80. pascal OSErr
  81. main(int, int, StringPtr, StringPtr, long, long);
  82.  
  83. void printerSetupDialog(void);
  84.  
  85. void retitleButton(DialogPtr, int, int *, htLabels);
  86.  
  87. int searchForValue(int, htLabels);
  88.  
  89. #define DIALOG_PTR_TYPE_TODAY DialogPtr
  90. #include "dialog_item_handling.h"
  91.  
  92.  
  93. /* Functions:*/
  94.  
  95. pascal OSErr
  96. main(message, caller, objName, zoneName, p1, p2)
  97. int message;
  98. int caller;
  99. StringPtr objName;
  100. StringPtr zoneName;
  101. long p1;
  102. long p2;
  103. {
  104.     if ((message == buttonMsg)
  105.         && (caller == 1  /* Chooser is the caller */)
  106.         && ((p2 & 0x000000FF) == 2  /* right button */)
  107.     ) {
  108.         printerSetupDialog();
  109.     }
  110.     return (noErr);  /* IM IV-218: "...always return noErr, except with select and deselect." */
  111. }  /* main */
  112.  
  113.  
  114. #define REMOVE_PARTS_UNDER_DEVELOPMENT
  115.  
  116. void printerSetupDialog()
  117. {
  118.     htSettings handleToCurrentSettings;
  119.     StringHandle userDefinablePrinterControlStrings;
  120.     htLabels baudLabels;
  121.     int currentNumberOfBaudAlternative;
  122.     htLabels resolutionLabels;
  123.     int currentNumberOfResolutionAlternative;
  124.     
  125.     DialogPtr theDialog;
  126.     WindowPtr savePort;
  127.     int itemHit;
  128.     
  129.     /* Fetch the current settings from our PRER file. */
  130.     /* According to IM V-432 it is the current resource file in PACK. */
  131.     if ((handleToCurrentSettings = (htSettings)(GetResource('Stng', RESID_OWNED_BY_PDEF))) == nil)
  132.         return;
  133.     if ((userDefinablePrinterControlStrings = (StringHandle)(GetResource('STR#', RESID_OWNED_BY_CHOOSER_PACK))) == nil)
  134.         return;
  135.     
  136.     /* Fetch the baud and screen dump resolution button alternatives. */
  137.     if ((baudLabels = (htLabels)(GetResource('B89L', RESID_OWNED_BY_CHOOSER_PACK))) == nil)
  138.         return;
  139.     if ((resolutionLabels = (htLabels)(GetResource('B89L', RESID_OWNED_BY_CHOOSER_PACK+1))) == nil)
  140.         return;
  141.     
  142.     /* Fetch the setup dialog. */
  143.     if ((theDialog = GetNewDialog(
  144.             RESID_OWNED_BY_CHOOSER_PACK,
  145.             nil,
  146.             (WindowPtr)(-1)  /* in front of all windows */
  147.         )) == nil)
  148.         return;
  149.     
  150.     /* Initialization of the dialog. */
  151.     pushRadioButton(
  152.         theDialog,
  153.         (((*handleToCurrentSettings)->port==0)?MODEMBUTTON:PRINTERBUTTON),
  154.         MODEMBUTTON,
  155.         PRINTERBUTTON
  156.     );
  157.     
  158.     currentNumberOfBaudAlternative =
  159.         searchForValue(
  160.             (*handleToCurrentSettings)->baud,
  161.             baudLabels
  162.         );
  163.     retitleButton(
  164.         theDialog,
  165.         BAUDBUTTON,
  166.         ¤tNumberOfBaudAlternative,
  167.         baudLabels
  168.     );
  169.     
  170.     pushRadioButton(
  171.         theDialog,
  172.         (((*handleToCurrentSettings)->xonXoff)?XONXOFFBUTTON:CTSBUTTON),
  173.         CTSBUTTON,
  174.         XONXOFFBUTTON
  175.     );
  176.     setStringItemToInt(
  177.         theDialog,
  178.         ORIGINTOPNUM,
  179.         (*handleToCurrentSettings)->printerOrigin.v
  180.     );
  181.     setStringItemToInt(
  182.         theDialog,
  183.         ORIGINLEFTNUM,
  184.         (*handleToCurrentSettings)->printerOrigin.h
  185.     );
  186.     
  187.     currentNumberOfResolutionAlternative =
  188.         searchForValue(
  189.             (*handleToCurrentSettings)->screenDumpResolution,
  190.             resolutionLabels
  191.         );
  192.     retitleButton(
  193.         theDialog,
  194.         DUMPRESOLUTIONBUTTON,
  195.         ¤tNumberOfResolutionAlternative,
  196.         resolutionLabels
  197.     );
  198.     
  199.     forceValueToControls(
  200.         theDialog,
  201.         (*handleToCurrentSettings)->useOnlyPCLLevel3Features,
  202.         COMPATIBLEBOX,
  203.         COMPATIBLEBOX
  204.     );
  205.     
  206.     forceValueToControls(
  207.         theDialog,
  208.         (*handleToCurrentSettings)->movePrintPositionBeforeEachWord,
  209.         MOVEBYWORDBOX,
  210.         MOVEBYWORDBOX
  211.     );
  212.     
  213. #ifndef REMOVE_PARTS_UNDER_DEVELOPMENT
  214.     /* This gets the printer control strings from a string list,
  215.     then sets the editText items in the dialog box to contain
  216.     the strings.
  217.     */
  218.     strptr = &((*mystrings)->thestrings[0]);
  219.     for (i=EOLITEM-1; EOFITEM - i++;) {
  220.         GetDItem(printdialog, i, &edittype, &edititem, &editbox);
  221.         SetIText(edititem, strptr);
  222.         strptr += (*strptr) + 1;
  223.     }  /* for */
  224. #endif
  225.     
  226.     GetPort(&savePort);
  227.     SetPort(theDialog);
  228.     ShowWindow(theDialog);
  229.  
  230.     frameButton(theDialog, OKBUTTON);
  231.     
  232. #ifndef REMOVE_PARTS_UNDER_DEVELOPMENT
  233.     PenSize(2, 2);
  234.     InsetRect(&baudbox, -3, -3);
  235.     FrameRoundRect(&baudbox, 12, 12);
  236. #endif
  237.  
  238.     itemHit = 0;
  239.     while (itemHit != OKBUTTON) {
  240.         ModalDialog(nil, &itemHit);
  241.         switch (itemHit) {
  242.             case BAUDBUTTON:  /* Next baud rate into button */
  243.                 currentNumberOfBaudAlternative++;
  244.                 retitleButton(
  245.                     theDialog,
  246.                     BAUDBUTTON,
  247.                     ¤tNumberOfBaudAlternative,
  248.                     baudLabels
  249.                 );
  250.                 break;
  251.             case DUMPRESOLUTIONBUTTON:  /* Next resolution rate into button */
  252.                 currentNumberOfResolutionAlternative++;
  253.                 retitleButton(
  254.                     theDialog,
  255.                     DUMPRESOLUTIONBUTTON,
  256.                     ¤tNumberOfResolutionAlternative,
  257.                     resolutionLabels
  258.                 );
  259.                 break;
  260.             case MODEMBUTTON:
  261.             case PRINTERBUTTON:
  262.                 pushRadioButton(theDialog, itemHit, MODEMBUTTON, PRINTERBUTTON);
  263.                 break;
  264.             case CTSBUTTON:
  265.             case XONXOFFBUTTON:
  266.                 pushRadioButton(theDialog, itemHit, CTSBUTTON, XONXOFFBUTTON);
  267.                 break;
  268.             case MOVEBYWORDBOX:
  269.             case COMPATIBLEBOX:
  270.                 pushCheckBox(theDialog, itemHit);
  271.                 break;
  272.             case CANCELBUTTON:
  273.                 goto cleanUp;
  274.                 break;
  275.             default:
  276.                 break;
  277.         }  /* switch */
  278.     }  /* while */
  279.     
  280.     /* User has clicked OK, we should read the dialog state */
  281.     /* and update 'Stng' and 'STR#' resources. */
  282.     
  283.     (*handleToCurrentSettings)->port =
  284.         whichRadioButton(theDialog, MODEMBUTTON, PRINTERBUTTON);
  285.     (*handleToCurrentSettings)->baud =
  286.         (*baudLabels)->alternative[currentNumberOfBaudAlternative].value;
  287.     (*handleToCurrentSettings)->xonXoff =
  288.         whichRadioButton(theDialog, CTSBUTTON, XONXOFFBUTTON);
  289.     (*handleToCurrentSettings)->printerOrigin.v =
  290.         getStringItemAsInt(theDialog, ORIGINTOPNUM);
  291.     (*handleToCurrentSettings)->printerOrigin.h =
  292.         getStringItemAsInt(theDialog, ORIGINLEFTNUM);
  293.     (*handleToCurrentSettings)->screenDumpResolution =
  294.         (*resolutionLabels)->alternative[currentNumberOfResolutionAlternative].value;
  295.     (*handleToCurrentSettings)->useOnlyPCLLevel3Features =
  296.         controlIsOn(theDialog, COMPATIBLEBOX);
  297.     (*handleToCurrentSettings)->movePrintPositionBeforeEachWord =
  298.         controlIsOn(theDialog, MOVEBYWORDBOX);
  299.     
  300.     ChangedResource(handleToCurrentSettings);
  301.     WriteResource(handleToCurrentSettings);
  302.  
  303. #ifndef REMOVE_PARTS_UNDER_DEVELOPMENT
  304.     /* First, determine the length. */
  305.     length = (long)(sizeof(int)+RESPAD);
  306.     for (i=EOLITEM-1; EOFITEM - i++;) {
  307.         GetDItem(printdialog, i, &edittype, &edititem, &editbox);
  308.         GetIText(edititem, thestring);
  309.         length += (long)thestring[0];
  310.     }  /* for */
  311.     
  312.     /* Size might have changed, so we unlock the handle and
  313.     attempt to resize it.
  314.     */
  315.     asm {
  316.         move.l    mystrings, a0    ;; save loading MacTraps
  317.         _HUnlock
  318.         move.l    mystrings, a0
  319.         move.l    length, d0
  320.         _SetHandleSize
  321.         move.l    mystrings, a0
  322.         _GetHandleSize
  323.         move.l    d0, result
  324.     }
  325.     if (result != length) {  /* Abort on error */
  326.         DisposDialog(printdialog);
  327.         SetPort(tempport);
  328.         return(FALSE);
  329.     }
  330.     asm {
  331.         move.l    mystrings, a0
  332.         _HNoPurge
  333.         move.l    mystrings, a0
  334.         _HLock
  335.     }
  336.     
  337.     /* Rebuild the STR# from item list. */
  338.     strptr = &((*mystrings)->thestrings[0]);
  339.     for (i=EOLITEM-1; EOFITEM - i++;) {
  340.         GetDItem(printdialog, i, &edittype, &edititem, &editbox);
  341.         GetIText(edititem, strptr);
  342.         strptr += (*strptr) + 1;
  343.     }  /* for */
  344.     ChangedResource(mystrings);
  345.     WriteResource(mystrings);
  346. #endif
  347.     
  348.     /* Now the changes must be copied to the driver globals. */
  349.     /* Chooser has namely opened the driver _before_ it lets */
  350.     /* the user use this setup. */
  351.     /* Let's try this ingenious approach: reopen XPrint and */
  352.     /* let it figure out how to use the new settings. */
  353.     /* After all, they are _XPrint_ settings! */
  354.     /* Unfortunately Device Manager does not reopen us, at least not */
  355.     /* with System 4.2. */
  356.     /* Don't know what to do. */
  357. #ifndef REMOVE_PARTS_UNDER_DEVELOPMENT
  358.     {
  359.         int weKnowAlreadyItIsTheSameAsIPrDrvrRef;
  360.         
  361.         if (OpenDriver(sPrDrvr, &weKnowAlreadyItIsTheSameAsIPrDrvrRef) != noErr)
  362.             SysBeep(30);  /* What else ??? */
  363.     }
  364. #endif
  365.     
  366. cleanUp:
  367.     DisposDialog(theDialog);
  368.     SetPort(savePort);
  369. }  /* printerSetupDialog */
  370.  
  371.  
  372. void retitleButton(theDialog, button, buttonCounter, labels)
  373. DialogPtr theDialog;
  374. int button;
  375. int *buttonCounter;
  376. htLabels labels;
  377. {
  378.     int itemType;
  379.     Handle theItem;
  380.     Rect itemBox;
  381.     
  382.     if ((*labels)->iNumberOfItems <= 0)
  383.         return;
  384.     
  385.     if ((*buttonCounter < 0)
  386.         || (*buttonCounter >= (*labels)->iNumberOfItems))
  387.         *buttonCounter = 0;
  388.     
  389.     GetDItem(theDialog, button, &itemType, &theItem, &itemBox);
  390.     HLock(labels);
  391.     SetCTitle(theItem, (*labels)->alternative[*buttonCounter].label);
  392.     HUnlock(labels);
  393. }  /* retitleButton */
  394.  
  395.  
  396. int searchForValue(value, labels)
  397. int value;
  398. htLabels labels;
  399. {
  400.     int i;
  401.     
  402.     for (i=0; i < ((*labels)->iNumberOfItems); i++)
  403.         if((*labels)->alternative[i].value == value)
  404.             return(i);
  405.     
  406.     return(0);
  407. }  /* searchForValue */
  408.  
  409. #include "dialog_item_handling.c"
  410.  
  411.